package com.angel.util;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.json.JSONObject;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.util.Log;

import com.angel.entity.FormFile;

public class UpLoadPicUtil {
	/*上传图片以及相关的请求参数
	 * 通过HTTP协议提交数据到服务器，实现如下表单提交功能
	 * @param path 上传路径（）
	 * @param params 请求参数
	 * @param formFile 上传文件表单
	 * 结果返回String对象
	 * */
    public static String post(String path,Map<String,String> params,FormFile formFile) throws IOException{
        int progress=0;
         String enterNewline="\r\n";  //回车换行
          String fix="--";
          String boundary="######";
          int maxBufferSize=1024*256;//每次最大的输入缓存容量
          int byteAvalible=0,bufferSize=0,byteRead;//
          int length=0;//读入的总字节数
        String responseType="";
        int  isUpload=0;//上传成功否的标志
        int  integral  =0;//当前等级积分
        int  rank=0;//当前等级数
    	URL url;
        DataOutputStream dataStream=null;
        long totalSize=formFile.getFile().length();//获得文件的总字节数
        Bitmap bit=compressBitmap(formFile.getFile().getAbsolutePath(),340);
//      FileInputStream in=new FileInputStream(new File(formFile.getFile().getAbsolutePath()));//获得图片输入流
      byte[] buffer=null;
      try {
            url = new URL(path);//根据地址获得URL对象
            HttpURLConnection con=(HttpURLConnection) url.openConnection();//打开连接,获得HttpURLConnection对象
                 /*设置请求传送参数，允许流输入输出，*/
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
            con.setReadTimeout(30000);//设置从主机读取数据超时
     //       con.setChunkedStreamingMode(1024*256);//设置每次发送的数据块大小
            con.setRequestMethod("POST");
            con.setRequestProperty("Connection", "Keep-Alive");//设置保持连接状态
            con.setRequestProperty("Charset","UTF-8");
            con.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
            dataStream=new DataOutputStream(con.getOutputStream());       //打开输出流通道,并未发送到服务器

           
            Set<String>  set=params.keySet();//获得关键字集合对象
            Iterator<String> iter=set.iterator();//将集合放于迭代器
            //循环写入文本域
            while(iter.hasNext()){
                 String key=iter.next();
                 String value=params.get(key);//获得对应的值
                 dataStream.writeBytes(fix+boundary+enterNewline);//规范输入的形式     
                 dataStream.writeBytes("Content-Disposition:form-data;"+"name=\""+key+"\""+enterNewline);//比如写入name="login"
                 dataStream.writeBytes(enterNewline);//上面的基础上再次回车换行
                 dataStream.writeBytes(value);//传送输入的值
                 dataStream.writeBytes(enterNewline);
            }
            //当传输内容不是文本时
            if(formFile!=null){
                 dataStream.writeBytes(fix+boundary+enterNewline);
                 dataStream.writeBytes("Content-Disposition:form-data;"+" name=\""+formFile.getParamName()+"\""+" ;filename=\""+formFile.getFileName()+"\""+enterNewline);
         //        dataStream.writeBytes("Content-Type: "+ formFile.getContentType()+"\r\n");
                 dataStream.writeBytes(enterNewline);
//                 byteAvalible=in.available();//文件中能输入的总字节
//                 bufferSize=Math.min(maxBufferSize, byteAvalible);
//                 buffer=new byte[bufferSize];  //生成大小为bufferSize的字节数组
//                 buffer=new byte[byteAvalible];
//                 byteRead=in.read(buffer,0,byteAvalible);//每次将最小的字节存储到字节数组中
                 /*根据可输入的字节与定义的最大字节作比较，循环输入直至结束*/
//                 while(byteRead>0){
//                      Log.i(TAG, "The buffer is:"+buffer);
//                      dataStream.write(buffer,0,bufferSize);
//                      length+=bufferSize;
//                      progress=(int)(length*100/totalSize);
//                      publishProgress(progress);//改写进度条
//                      byteAvalible=in.available();//判断是否还有可输入的字节
//                      bufferSize=Math.min(maxBufferSize, byteAvalible);
//                      byteRead=in.read(buffer,0,bufferSize);
//                 }
                 bit.compress(CompressFormat.JPEG, 70, dataStream);
//                 dataStream.write(buffer,0,byteAvalible);
                 dataStream.writeBytes(enterNewline);
            }
            dataStream.writeBytes(fix+boundary+fix+enterNewline);
   //         publishProgress(100);//上传完毕后进度为100
          dataStream.flush();//Flushes this stream to ensure all pending data is sent out to the target stream
//          in.close();
          int serverResponseCode = con.getResponseCode();
       
          InputStream inStream=con.getInputStream();//发送流到服务器，并返回服务器端响应结果
          StringBuilder builder=new StringBuilder();//生成对象StringBuilder
              int c; //接收字符转化为整型
         // responseType=con.getHeaderField("Content-Type");
            //判断获得的响应是否正常或不空
            if(con.getResponseCode()==HttpURLConnection.HTTP_OK)    //&&responseType!=null
            {   //将获取的字节流读取出来
                 while((c=inStream.read())!=-1){
                      builder.append((char)c);
                 }
              responseType=builder.toString();   
            }
      }catch(Exception e){
    	  Log.i("uploaUtil","uploadException"+e.toString());
      }
      Log.i("responseType","responseType:"+responseType);
      return responseType;
	}
    /**用于通过指定图片大小，缩放Bimtap
     * @param pathName 待压缩的图片的完整路径
     * @param h  指定图片缩放成的高度大小
     * 返回缩放后的Bimtap对象
     */
	public static Bitmap compressBitmap(String pathName,int h){
		BitmapFactory.Options opt=new BitmapFactory.Options();
		Bitmap bitmap=null;
		opt.inJustDecodeBounds=true;//设置该属性使得测量Bitmap时候不取出到内存
		bitmap=BitmapFactory.decodeFile(pathName);
		int be=bitmap.getHeight()/h;
		if(be<=0){
		   be=1;
		}
		opt.inSampleSize=be;//缩放图片为原来的1/be
		opt.inJustDecodeBounds=false;
		return BitmapFactory.decodeFile(pathName, opt);
	}
}
